# 带返回的函数
def sum2 (a,b) :
    return a+b

print(sum2(10,20))
print('--'*30)


def happy (name,age) :
    print(f'祝{name}生日快乐')
    print(f'{str(age)}岁生日快乐')


# 位置传参
happy('张三',19)
# happy(10,'李四') #报错了
# happy('王六')  参数少传也不对

print('--'*40)
# 关健字传参， 实参必须与形参一一对应，不可缺少  关健字传参时顺序可以不管，但是关健字传参与位置传参混用，关健字传参必须在最后面
happy(name='张三',age='19')
happy('李四',10)
happy('张三',age=10)
# happy(name="王五", 10)  关健字参数必须放在后面
# happy('王五')  参数缺失会报错
happy(age='30', name="三三")
# happy(19,name='刘刘')会报错
print('--'*30)


# 默认参数 ， 形参有默认值，在不传的情况使用默认值
def job(name='默认值', num = 1) :
    print(f'请问{name}是失业了吗')
    print(f'失业{str(num)}多月了')

job() #可以没参数
job(num = 2) #可以任传一个
job(name="张三")
job(23)
job('张三',3)
job('张三',num = 1)
# job(2,name='李四') 报错

# 总结：不管是位置传参还是关健字与位置混合，顺序不可变 ， 如果全是关健字传参无所谓，有默认值时可省略某个参数,

print('--'*40)

#可变参数
def get_sum(*argu) :  #返回的是一个元组
    print(argu)
    print(type(argu))
    s=0
    for item in argu :
       s+=item
    return s

print(get_sum(1,2,3,4,5))
print(get_sum(1,2,3))
print(get_sum(*[1,23,4,5,6])) #传一个列表进去，相当于一个参数，可以在前面加*号来转换成一个个传入

print('---'*30)
def get_dist(**argu) :
    print(argu)
    print(type(argu))
    for key,item in argu.items() :
        print(key,'---->',item)

get_dist(name="张三", age=10, job="前端")
get_dist(**{"name":"李四", "age":10, "job":"java"}) #传入字典可以通过添加 ** 两个星号，去把每一对key-value传入





# 变量作用域
a = 100
def getsum(x,y) :
    return x+y+a
# print(x,y) 无法找到 x y 因为它们是函数内部的变量
print(a) #  全局变量

def getScale(x,y) :
    a = 300
    return x+y+a

print(getScale(10,30)) #340  全局变量与局部变量命名相同时，就近原则
print('--'*40)
def getsum2 (x,y) :
    global a
    a=400
    return x+y+a
print(getsum2(30,40))
print(a) #使用global 可以把变量全局化，


print('--'*40)
# 匿名函数
result = lambda x:x*10
print(result(199))

res2 = lambda x,y : x*y
print(res2(11,20))

lst = [10,30,50]
s = 0
for item in lst:
    res3 = lambda x,y : x+y
    s = res3(item,s)
print(s)

# 递归
# 斐波那器数
# 1 1 2 3 5 8 13 21 44
def qs (x) :
    if x== 1 or x == 2 :
        return 1
    else :
        return qs(x-1)+qs(x-2)
print(qs(4))

def suma (n) :
    if int(n) < 0 :
        return -1
    elif int(n) == 1 :
        return 1
    else :
        lst = [2,8]
        for i in range(1,n) :
            lst.append(lst[-1]+lst[-2])
            return lst[-2]%lst[-1]
print(suma(7),'==')


# 可以返回多个参数 是一个元组
def argu (a,b,c) :
    return a,b,c
a = argu(1,2,3)
print(a, type(a))




import random
import re
#  随机生成10个数，放在列表中，取出最大值
lst3=[]
for item  in range(0,10) :
    lst3.append(random.randint(1,100))
print(lst3)
def maxNum (lst) :
    max = 0
    for item in lst :
        if(item>max) :
            max = item
    return f'最大值为{max}'

print(maxNum(lst3))



# 收集用户输入的字符串，提取数字，存在列表中，并求和
useStr= input('请输入一个带数字的字符串：')
def sumList (str) :
    lst5=list()
    sum=0
    if str.isdigit() :
        lst5 = list(str)
    else :
        p = '\\d+'
        lst5 = re.findall(p,str)
    if len(lst5) != 0 :
        for item in lst5 :
            sum+=int(item)
    return sum,lst5

print(sumList(useStr))

# 第二种

us = input('请输入字符串')
lst6=[]
def vdigit (x) :
    for i in x :

        if i.isdigit() :
            print(i, '-i')
            lst6.append(int(i))
    s = sum(lst6) #内置的求和函数 sum
    return s,lst6
results= vdigit(us)

print(results)


# 接收一个字符串，大写转小写，小写转大写
us3 = input('请输入一个字符串：')
lstt=[]
def toggle (x) :
    for i in x :
        if i.isalpha() :
            if(i.islower()) :
                lstt.append(i.upper())
            else :
                lstt.append(i.lower())
        else :
            lstt.append(i)
    return ''.join(lstt)
print(toggle(us3))

